MyBatis 版本:MyBatis 3.3.0
MyBatis 官方网站(英文):MyBatis 英文官网
MyBatis 官方网站(中文):MyBatis 中文官网
MyBatis 源码:MyBatis 源码
MyBatis 基本构成
MyBatis 核心组件:
- SqlSessionFactoryBuilder:根据 MyBatis 配置(文件或代码)创建 SqlSessionFactory
- SqlSessionFactory:SqlSessionFactory 创建 SqlSession
- SqlSession:SQL 执行会话
- SQL Mapper:SQL 和 POJO 映射规则
构建 SqlSessionFactory
SqlSessionFactory 是 MyBatis 核心组件,可通过 SqlSessionFactoryBuilder 获得,其任务是创建 SqlSession。
MyBatis 提供两者模式创建 SqlSessionFactory:
- XML 配置
- 代码编码
SqlSessionFactory 依赖于配置类 org.apache.ibatis.session.Configuration。
Configuration 保存了所有的配置信息,且将存在于整个 MyBatis 应用的整个生命周期,可以重复的读取和运用。
SqlSessionFactory 是一个接口,MyBatis 提供两个 SqlSessionFactory 实现类:
- DefaultSqlSessionFactory
- SqlSessionManager
MyBatis 暂未使用 SqlSessionManager,目前只使用 DefaultSqlSessionFactory。
从 XML 中构建 SqlSessionFactory
参考官方示例:1
2
3String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
configuration XML1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20"1.0" encoding="UTF-8" xml version=
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
不使用 XML 构建 SqlSessionFactory
参考官方示例:1
2
3
4
5
6DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
官方推荐使用从 XML 中构建 SqlSessionFactory
从 SqlSessionFactory 中获取 SqlSession
在 MyBatis 中 SqlSession 接口的实现类有两个:
- DefaultSqlSession
- SqlSessionManager
MyBatis 暂未使用 SqlSessionManager,目前只使用 DefaultSqlSession。
SqlSession 的用途主要有两种:
- 直接执行SQL
1
2
3
4
5
6SqlSession session = sqlSessionFactory.openSession();
try {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}
该方式是 iBatis 版本留下的方式。
- 获取映射器
1
2
3
4
5
6
7SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
该方式是 MyBatis 推荐的方式。
映射器
映射器是由 Java 接口和 XML 文件(或注解)共同组成:
- 定义参数类型
- 描述缓存
- 描述 SQL 语句
- 定义查询结果和 POJO 的映射关系
一个映射器的实现方式有两种:
Java 注解
1 | package org.mybatis.example; |
对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱。
XML 文件
使用 XML 文件配置是 MyBatis 实现 Mapper 的首选方式。
由一个 Java 接口和一个 XML 文件构成。
Java 接口:1
2
3public interface BlogMapper {
Blog getBlog(Long id);
}
XML 文件:1
2
3
4
5
6
7
8
9"1.0" encoding="UTF-8" xml version=
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
生命周期
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 是利用 XML 或 Java 编码获得资源来构建 SqlSessionFactory。
其作用就是构建 SqlSessionFactory ,一旦构建了 SqlSessionFactory ,其就失去了存在的意义。
故生命周期只存在于方法的局部。
SqlSessionFactory
SqlSessionFactory 的作用是创建 SqlSession。
每次应用程序需要访问数据库,就要通过 SqlSessionFactory 创建 SqlSession。
故其生命周期应存在于整个 MyBatis 应用生命周期。
一个数据库应该只对应一个 SqlSessionFactory。
SqlSession
SqlSession 是一个会话,生命周期应该是在请求数据库处理事务的过程中。
故其生命周期只存于一次数据库事务中。
Mapper
Mapper 的作用是执行 SQL,其是配合 SqlSession 一同使用。
故其生命周期和 SqlSession 一致。